/* 
   对象传参
   options
       url:请求的地址
       data:携带的数据(参数数据队列 a=1&b=2&c=3)
       async:是否异步(默认true)
       dataType: 接口返回的数据类型 (方法默认text, 其他类型需要用户指定)
       success:  请求成功时执行的回调函数  => 函数有一个形参,用于接收请求的数据

   */
export function ajax(options) { // 传入一个配置对象 => {url:xxx, data:xxx, async:xxxx,dataType:xxxx,success:xxx}

    var { type = "get", url, data, async = true, dataType = "text", success,error } = options;

    var xhr = new XMLHttpRequest();

    if (Object.prototype.toString.call(data) == "[object Object]") {
        var list = [];
        for (var key in data) {
            var val = data[key];
            var subStr = key + "=" + val;
            list.push(subStr);
        }
        data = list.join("&");
    }
    // console.log(data);

    if (type.toLowerCase() == "get") { // "GET"
        xhr.open("get", data ? url + "?" + data : url, async)
        xhr.send();
    } else if (type.toLowerCase() == "post") {
        xhr.open("post", url, async)
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(data);
    }


    xhr.onreadystatechange = function () {
        // debugger;
        try{
            if (xhr.readyState == 4 && xhr.status == 200) {
                var res = xhr.responseText;
                if (dataType == "json") {
                    res = JSON.parse(res);
                }
                // console.log(res);  // js对象
    
                // 获取数据之后 -> 可能要执行的操作不一样
                // 搜索 => 拿到数据渲染
                // 注册 -> 跳转登录
                // 删除 -> 提示
    
                // 请求成功时执行的回调函数
                if (success && typeof success == "function") {
                    success(res);  // 调用回调函数值,请求的数据作为实参
                }
            }
        }catch(err){


            // 错误发生时 后续处理
            // 有error 回调函数 => 就执行回调函数
            // 没有 error回调函数  => 抛出错误
            if (error && typeof error == "function") {
                error(err);
            }else{
                throw err;
            }
           
        }
    }
}


export function AjaxPromise(options) {
    // 方法默认返回 Promise实例 {<pending>:undefined}
    return new Promise(function (resolve, reject) {
        var { type = "get", url, data, async = true, dataType = "text" } = options;

        var xhr = new XMLHttpRequest();

        if (Object.prototype.toString.call(data) == "[object Object]") {
            var list = [];
            for (var key in data) {
                var val = data[key];
                var subStr = key + "=" + val;
                list.push(subStr);
            }
            data = list.join("&");
        }
        // console.log(data);

        if (type.toLowerCase() == "get") { // "GET"
            xhr.open("get", data ? url + "?" + data : url, async)
            xhr.send();
        } else if (type.toLowerCase() == "post") {
            xhr.open("post", url, async)
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.send(data);
        }


        xhr.onreadystatechange = function () {
            // debugger;
            try {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var res = xhr.responseText;
                    if (dataType == "json") {
                        res = JSON.parse(res);
                    }
                    // console.log(res);  // js对象

                    // 获取数据之后 -> 可能要执行的操作不一样
                    // 搜索 => 拿到数据渲染
                    // 注册 -> 跳转登录
                    // 删除 -> 提示

                    // 请求成功时执行的回调函数
                    // if (success && typeof success == "function") {
                    //     success(res);  // 调用回调函数值,请求的数据作为实参
                    // }
                    resolve(res); // {<fulfilled>:res}
                }
            } catch (err) {


                // 错误发生时 后续处理
                // 有error 回调函数 => 就执行回调函数
                // 没有 error回调函数  => 抛出错误
                // if (error && typeof error == "function") {
                //     error(err);
                // } else {
                //     throw err;
                // }

                reject(err);  // {rejected:err}

            }
        }
    })
}


/* ajax({
    type:"get",
    url:"xxx",
    data:"xxx",
    dataType:"json",
    success:function(res){

    },
    error:function(err){

    }
}) */


/* var p = AjaxPromise({
    type:"get",
    url:"xxx",
    data:"xxx",
    dataType:"json",
})

p.then().catch() */


// AjaxPromise({
//     type:"get",
//     url:"xxx",
//     data:"xxx",
//     dataType:"json",
// }).then().catch()